//! Razne funkcije koje (jos) ne potpadaju nigdje drugdje

#ifndef	_ARH_RAZNO_H_
#define	_ARH_RAZNO_H_

#include "ispis.h"
#include "prekidi.h"

#define EFLAGS_IF	0x00000200	// Interrupt Enable (9)

#define	arh_zaustavi()	\
	__asm__ ("hlt\n\t"); //! Ne radi nista i ceka interrupt

#define arh_zaustavi_potpuno(poruka)		\
{						\
	arh_ispisi_rijec("KRITICNA GRESKA:");	\
	arh_ispisi_rijec(poruka);		\
	__asm__ ("cli\n\t" "hlt\n\t");		\
}

//! Omoguci prekide
#define	arh_prekidi_dozvoli_prekidanje()	__asm__ ("sti")

//! Zabrani prekidanje
#define	arh_prekidi_zabrani_prekidanje()	__asm__ ("cli")

#define arh_generiraj_prekid(X)	\
	__asm__ __volatile__("int %0\n\t" :: "i" (X) : "memory")


//dozvoljava prekidanje (ako je dozvola!=0) ili zabranjuje prekide (dozvola=0)
//vraca prethodno stanje: 0 ako su prekidi bili zabranjeni, !=0 ako nisu
static inline int arh_dozvoli_prekide(int dozvola) {
	int prije;

	__asm__ __volatile__ ("pushf\n\t" "pop %0\n\t": "=r" (prije));

	if (dozvola)
		__asm__ ("sti");
	else
		__asm__ ("cli");

	return prije & EFLAGS_IF;
}

#endif	/* _ARH_RAZNO_H_ */
